package com.gitee.huanminabc.fastboot.load.config;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gitee.huanminabc.jcommon.str.StringTypeCastUtil;
import com.gitee.huanminabc.fastboot.context.AppContext;
import lombok.extern.slf4j.Slf4j;

/**
 * @program: netty-web
 * @description:
 * @author: huanmin
 * @create: 2025-04-01 11:47
 **/
@Slf4j
public class AppConfigUtil {

    public static Object getConfigValue(String expression) {
        //${} 判断是否
        if (expression == null || expression.isEmpty()) {
            return null;
        }
        if (!expression.startsWith("${") && !expression.endsWith("}")) {
            return null;
        }
        //去掉${}
        expression = expression.substring(2, expression.length() - 1);
        //判断是否存在按照:分割
        String[] strings = expression.split(":");
        Object defaultValue = null;
        if (strings.length == 2) {
            defaultValue = StringTypeCastUtil.cast(strings[1]);
        }
        Object configValue0 = getConfigValue0(AppContext.appConfigMap, expression);
        return configValue0 == null ? defaultValue : configValue0;
    }

    /**
     * 根据表达式路径访问JSONObject对象中的值
     *
     * @param jsonObject     要访问的JSONObject对象
     * @param expressionPath 表达式路径，如 "fdfs.baseUrl" 或 "fdfs.users[0].name"
     * @return 访问到的值，如果路径无效则返回null
     */
    private static Object getConfigValue0(JSONObject jsonObject, String expressionPath) {
        if (jsonObject == null || expressionPath == null || expressionPath.isEmpty()) {
            return null;
        }

        String[] parts = expressionPath.split("\\.", 2); // 分割路径为当前部分和剩余部分
        String currentPart = parts[0];
        String remainingPath = parts.length > 1 ? parts[1] : null;

        // 检查当前部分是否包含数组索引（如 "users[0]"）
        if (currentPart.contains("[") && currentPart.contains("]")) {
            String key = currentPart.substring(0, currentPart.indexOf('['));
            String indexStr = currentPart.substring(currentPart.indexOf('[') + 1, currentPart.indexOf(']'));
            int index = Integer.parseInt(indexStr);

            if (jsonObject.get(key) instanceof JSONArray) {
                JSONArray jsonArray = jsonObject.getJSONArray(key);
                if (index >= 0 && index < jsonArray.size()) {
                    Object arrayElement = jsonArray.get(index);
                    if (arrayElement instanceof JSONObject && remainingPath != null) {
                        // 递归访问剩余路径
                        return getConfigValue0((JSONObject) arrayElement, remainingPath);
                    } else if (remainingPath == null) {
                        // 如果没有剩余路径，直接返回数组元素
                        return arrayElement;
                    }
                }
            }
            return null; // 索引无效或类型不匹配
        } else {
            // 当前部分不包含数组索引，直接访问JSONObject
            if (jsonObject.get(currentPart) != null) {
                Object value = jsonObject.get(currentPart);
                if (value instanceof JSONObject && remainingPath != null) {
                    // 递归访问剩余路径
                    return getConfigValue0((JSONObject) value, remainingPath);
                } else if (remainingPath == null) {
                    // 如果没有剩余路径，直接返回值
                    return value;
                }
            }
            return null; // 键不存在
        }
    }


}
